iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
DevOps

學會 Kubernetes 然後呢?由 Istio 進入 DevOps 偉大航路系列 第 12

Day12 - 使用 Istio 實現金絲雀部署 (Canary Deployment)

  • 分享至 

  • xImage
  •  

前言

Day08 介紹過好幾種不同的部署策略,幫助我們完成應用程式的版本更新。本篇要介紹的金絲雀部署是現今常使用的部署策略,至於它的原理是什麼,以及要如何使用 Istio 來實現,就讓我們看下去吧!

什麼是金絲雀部署 (Canary Deployment)

部署策略怎麼會跟金絲雀有關係呢?此名稱的緣由與早期礦坑作業有關,科學家發現小型恆溫動物受到毒氣影響的時間會比人類快,於是發明了讓金絲雀探測毒氣的籠子,在進入礦坑前,礦工能先使用金絲雀測試是否有毒氣。

https://ithelp.ithome.com.tw/upload/images/20220921/20139235yp24SI3zXO.jpg

而金絲雀部署(Canary Deployment) 與拿金絲雀來預警的原理相似,Canary 會先將少部份的流量導入新版本,讓少數使用者測試,若系統運作正常,在逐步將正式環境的流量從舊版本慢慢轉移到新版本。使用 Canary 的優點除了能達成 Zero Downtime (零停機) 之外,若新版本有問題也只會影響少數使用者,從而降低新版本發佈的風險。

使用 Istio 實現 Canary

那要如何在 Istio 實現 Canary 呢?可以使用 Virtual Service 的 Weight Routing 功能實現,Weight Routing 能夠設置不同版本間的流量比例,我們先將小部分流量轉移到新版本,測試沒問題後,在逐步增加流量,直到所有流量都轉移到新版本,就完成了 Canary 部署。

https://ithelp.ithome.com.tw/upload/images/20220921/20139235j5Y52clnwM.png

使用 Istio 控制不同版本的流量,逐步將流量從舊版本轉移至新版本

接著就來實驗看看吧!請先參考 Day10 - 準備 Istio 實驗環境 的教學,將 Istio 及 Bookinfo Application 環境準備好,接著就可以依照以下步驟實現 Canary。

  1. 先將舊的 destinationRule 與 virtualService 清除
kubectl delete --all destinationRule
kubectl delete --all virtualService

將 Reviews 不同版本的 Pod 用 Destination Rule 進行分組。

  1. 建立 destination-rule.yaml 檔案
  • destination-rule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
  - name: v3
    labels:
      version: v3
  1. 使用 kubectl 部署 DestinationRule
kubectl apply -f destination-rule.yaml
kubectl get destinationRule

(輸出結果)

NAME      HOST      AGE
reviews   reviews   49s

再來就可以使用 Virtual Service 定義 Weight Routing ,一開始先將所有流量導入 V1

  1. 建立 virtual-service.yaml 檔案
  • virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 100
    - destination:
        host: reviews
        subset: v2
      weight: 0
  1. 使用 kubectl 部署 VirtualService
kubectl apply -f virtual-service.yaml
kubectl get virtualService

(輸出結果)

NAME      GATEWAYS   HOSTS         AGE
reviews              ["reviews"]   9s
  1. 使用 kubectl port-forward 將流量轉入應用程式
kubectl port-forward svc/productpage 8080:9080

這是可以開啟瀏覽器查看,或是使用 Curl 指令來檢查版本

https://ithelp.ithome.com.tw/upload/images/20220921/201392353pYy9nsDL0.png

目前流量皆為 v1 版本

  1. 接著修改 virtual-service.yaml 檔案,修改 weight 比例為 75:25
  • virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 75 # change to 75
    - destination:
        host: reviews
        subset: v2
      weight: 25 # change to 25
  1. 使用 kubectl 部署 VirtualService 後,在進入網站檢查版本變化
kubectl apply -f virtual-service.yaml

https://ithelp.ithome.com.tw/upload/images/20220921/20139235bYHpWWFQiu.png

會發現有些流量轉入 v2 版本,但大部分都是 v1 版本

  1. 重複修改 weight 流量比例並檢查版本變化,直到 v2 版本的流量變為 100%

https://ithelp.ithome.com.tw/upload/images/20220921/20139235sK3ziP9qba.png

v1 版本與 v2 版本 Weight 各為 50% 的情形

https://ithelp.ithome.com.tw/upload/images/20220921/20139235LVw5p1LYmu.png

流量全部轉移至新版本,代表完成 Canary Deployment 整個流程,可以再嘗試從 v2 更新至 v3 看看

總結

本章使用 Istio 的 virtualService 輕鬆完成 Canary Deployment ,是不是開始感受到 Istio 的威力,下一章我們會介紹另一個部署策略 A/B Testing ,讓你更了解 Istio 的使用方式。


上一篇
Day11 - 一次清楚搞懂 Istio Virtual Service 及 Destination Rule
下一篇
Day13 - 使用 Istio 實現 A/B 測試 (A/B Testing)
系列文
學會 Kubernetes 然後呢?由 Istio 進入 DevOps 偉大航路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
vulxk2u4210
iT邦新手 5 級 ‧ 2023-12-18 21:26:17

您好,我想詢問一下如何在windows下的powershell下看到圖中的資訊?因為打了圖中的指令有錯誤,所以想請教一下!感謝您
https://ithelp.ithome.com.tw/upload/images/20231218/201527278MlMskAWxv.png

我要留言

立即登入留言